﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using SIM.Geo.BE;
using System.Linq;

namespace SIM.Geo.DA
{
    public class DALitologia : Base
    {
        #region Metodos

        /// <summary>
        /// Devuelve la lista de Litologias
        /// </summary>
        /// <returns></returns>
        public List<Litologia> ListarLitologia()
        {
            return this.Context.Litologia.ToList();
        }

        /// <summary>
        /// Devuelve la lista de Litologias por Sondaje
        /// </summary>
        /// <returns></returns>
        public List<LitologiaResponse> BuscarLitologiaPorSondaje(int codigoSondaje)
        {
            return this.Context.Litologia.Where(x => x.CodigoSondaje == codigoSondaje)
                .Select(x => new LitologiaResponse
                {
                    CodigoSondaje = x.CodigoSondaje,
                    CodigoLitologia = x.CodigoLitologia,
                    Desde = x.Desde,
                    Hasta = x.Hasta,
                    Descripcion = x.Descripcion,
                    Angulo = x.Angulo,
                    InterpretaCantidadMineral = x.InterpretaCantidadMineral,
                    InterpretaGradoAlteracion = x.InterpretaGradoAlteracion,
                    InterpretaMinerales = x.InterpretaMinerales,
                    InterpretaTexturaMineral = x.InterpretaTexturaMineral,
                    InterpretaTipoAlteracion = x.InterpretaTipoAlteracion,
                    NombreGeologo = x.Geologo.Nombres + " " + x.Geologo.ApellidoPaterno + " " + x.Geologo.ApellidoMaterno
                }
                ).OrderBy(x => x.CodigoLitologia).ToList();
        }

        /// <summary>
        /// Registra nuevo Litologia
        /// </summary>
        /// <param name="Litologia"></param>
        /// <returns></returns>
        public string InsertarLitologia(Litologia litologia)
        {
            this.Context.Litologia.AddObject(litologia);
            this.Context.SaveChanges();
            return litologia.CodigoLitologia;

        }

        /// <summary>
        /// Modifica un Litologia
        /// </summary>
        /// <param name="Litologia"></param>
        public void ModificarLitologia(Litologia litologia)
        {

            this.Context.Litologia.Attach(litologia);
            this.Context.ObjectStateManager.ChangeObjectState(litologia, EntityState.Modified);
            foreach (var item in litologia.LitologiaAlteraciones)
            {
                this.Context.ObjectStateManager.ChangeObjectState(item, EntityState.Added);
            }

            foreach (var item in litologia.LitologiaMinerales)
            {
                this.Context.ObjectStateManager.ChangeObjectState(item, EntityState.Added);
            }
            this.Context.SaveChanges();

        }

        /// <summary>
        /// Eliminar un Litologia
        /// </summary>
        /// <param name="Litologia"></param>
        public void EliminarLitologia(int codigoSondaje, string codigoLitologia)
        {

            //this.Context.Litologia.Attach(litologia);
            //this.Context.ObjectStateManager.ChangeObjectState(litologia, EntityState.Deleted);
            //this.Context.SaveChanges();
            this.Context.eliminarLitologia(codigoSondaje, codigoLitologia);

        }

        /// <summary>
        /// Obtiene un Litologia
        /// </summary>
        /// <param name="codigoLitologia"></param>
        /// <returns></returns>
        public Litologia ObtenerLitologia(int codigoSondaje, string codigoLitologia)
        {
            return this.Context.Litologia.Where(x => x.CodigoSondaje == codigoSondaje && x.CodigoLitologia.Equals(codigoLitologia)).FirstOrDefault();
        }

        /// <summary>
        /// Genera correlativo de Litologia por Sondaje
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <returns></returns>
        public string GenerarCodigoLitologia(int codigoSondaje)
        {
            System.Data.Objects.ObjectResult<string> lista = this.Context.generarCodigoLitologia(codigoSondaje);
            return lista.FirstOrDefault();
        }

        /// <summary>
        /// Devuelve la lista de Litologias por Sondaje, Invoca a un procedimiento almacenado
        /// </summary>
        /// <returns></returns>
        public List<buscarLitologia_Result> BuscarLitologiaPorSondaje1(int codigoSondaje)
        {
            return this.Context.buscarLitologia(codigoSondaje).ToList();
        }

        /// <summary>
        /// Validar Interseccion
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <param name="tipoAnalisis"></param>
        /// <param name="desde"></param>
        /// <param name="hasta"></param>
        /// <returns></returns>
        public int ValidarInterseccionLitologia(int codigoSondaje, string codigoLitologia, double desde, double hasta)
        {
            System.Data.Objects.ObjectParameter output = new System.Data.Objects.ObjectParameter("Result", 0);
            int result = (int)this.Context.validarInterseccionLitologia(codigoSondaje, codigoLitologia, desde, hasta, output).FirstOrDefault();
            return result;
        }

        /// <summary>
        /// Devuelve la lista de descripcion por codigo de sondaje
        /// </summary>
        /// <returns></returns>
        public List<Litologia> ListarObservacionPorSondaje(int codigoSondaje)
        {
            return this.Context.Litologia.Where(x => x.CodigoSondaje.Equals(codigoSondaje)).ToList();

        }

        /// <summary>
        /// Devuelve el ultimo Hasta
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <returns></returns>
        public double ObtenerUltimoHasta(int codigoSondaje)
        {
            return (double)this.Context.obtenerUltimoHastaLitologia(codigoSondaje).FirstOrDefault();
        }
        #endregion
    }
}
